/*! \class ImageEditorMainWindow
 *
 *  \brief Klasa reprezentująca graficzny interfejs użytkownika, wywołuje odpowiednie komendy w reakcji na polecenia użytkownika
 *
 *  \author Marcin Krzewski
 *  \author Katarzyna Rusinowska 
 *  \author Jakub Sitnicki   
 *  \date    06/2009
 */

#ifndef __ImageEditorMainWindow__
#define __ImageEditorMainWindow__

#include <string>

#include <wx/wx.h>
#include <exception>
#include <wx/gdicmn.h>
#include <wx/dcclient.h>
#include <wx/image.h>
#include <wx/colour.h>
#include <wx/filedlg.h>
#include <wx/msgdlg.h>
#include <wx/dialog.h>
#include <wx/filename.h>

#include "../ged/typedefs.hpp"
#include "../ged/Observer.hpp"

#include "ImageEditor.h"

using namespace ged;

//! Klasa reprezentująca graficzny interfejs użytkownika
class ImageEditorMainWindow : public MainWindow, Observer
{
public:
	/*! 
	* Konstruktor
	*
	* Konstruktor klasy bazowej tworzy główne okno graficznego interfejsu użytkownika
	*/
	ImageEditorMainWindow( wxWindow* parent );

	/*!
	* Funkcja uaktualniająca wyświetlane informacje
	*
	* Pobiera aktualny spłaszczony GIL widok i przepisuje go do formatu wxImage
	*/
	void update();

protected:
	/*!
	* Funkcje obsługi zdarzeń pochodzących od systemu oraz 
	* wygenerowane podczas interakcji z użytkownikiem,
	* odpowiedzialne za wywolywanie komend.
	* System przegląda tabele zdażeń i skojarzone z nimi funkcje, 
	* nastepnie wybiera najodpowiedniejszą danemu zdarzeniu.
	*
	* /param obiekty dziedziczące po głównej klasie zdarzeń wxEvent
	*/

	void close( wxCloseEvent& event ) { close(); }
	void quit( wxCommandEvent& event ) { close(); }
	void resize( wxSizeEvent& event );
	void paint( wxPaintEvent& event );
	void open( wxCommandEvent& event );
	void save( wxCommandEvent& event );
	void save_as( wxCommandEvent& event );
	void above_layer( wxCommandEvent& event );
	void below_layer( wxCommandEvent& event );
	void move( wxCommandEvent& event );
	void undo( wxCommandEvent& event );
	void redo( wxCommandEvent& event );
	void rotate_left( wxCommandEvent& event );
	void rotate_right( wxCommandEvent& event );
	void flip_up_down( wxCommandEvent& event );
	void flip_left_right( wxCommandEvent& event );
	void crop( wxCommandEvent& event );
	void subsampled( wxCommandEvent& event );

private:
	/*!
	* Pomocnicza funkcja zamykająca aplikację
	*/
	void close();
	/**!
	* Pomocnicza funkcja wyświetlająca aktualny widok
	*
	* /param kontekst na którym ma zostać wyświtlony aktualny widok
	*/
	void display(wxDC&  dc);
	/*!
	* Pomocnicza funkcja odpowiedzialna za wykonywanie komend
	* 
	* /param obiekt komendy dziedziczący po klasie Command
	*/
	void doCommand(PCommand cmd);

	//! Ścieżka do pliki
	std::string path_;

	//! Typ pliku
	int filetype_;
	
	//! Obraz stworzony na podstawie widoku GIL
	wxImage image_;

	//! Bitmapa wyświetlana na odpowiednim kontekście
	wxBitmap bitmap_;

	//! Aktualna szerokość okna
	int panel_width_;

	//! Aktualna wysokość okna
	int panel_height_;

	//! Współrzędne środka okna, wykożystywane do wyświetlenia bitmapy w odpowiednim miejscu
	int x_middle_;
	int y_middle_;

	//! Ustawinone przesunięcie warstwy
	int x_offset_;
	int y_offset_;
};

#endif // __ImageEditorMainWindow__
